package com.codemobiles.droidslator;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Point;
import android.util.Log;

/**
 * This class is responsible for encapsulating element needed for a bitmap
 * image.
 * 
 * @author jaboho
 * 
 */
public class SimpleImage {
  private Bitmap img;
  private int X = 0;
  private int Y = 0;
  private int beginX = 0;
  private int beginY = 0;
  private String id;
  private int[] orgPix;
  private Context context;
  private int titleID;

  public SimpleImage(Context context, int drawable, Point point, boolean fixedPos, String identifier) {
    BitmapFactory.Options opts = new BitmapFactory.Options();
    opts.inJustDecodeBounds = true;
    this.context = context;
    img = BitmapFactory.decodeResource(this.context.getResources(), drawable);
    orgPix = new int[getWidth() * getHeight()];
    img.getPixels(orgPix, 0, getWidth(), 0, 0, getWidth(), getHeight());
    id = identifier;
    X = point.x;
    Y = point.y;
    beginX = point.x;
    beginY = point.y;
  }
  
  public void reDrawImage(int drawable, String identifier){
    img = null;
    img = BitmapFactory.decodeResource(this.context.getResources(), drawable);
    orgPix = new int[getWidth() * getHeight()];
    img.getPixels(orgPix, 0, getWidth(), 0, 0, getWidth(), getHeight());
    id = identifier;
  }

  public void setPosition(RegionSpec reg) {
    this.X = reg.getX();
    this.Y = reg.getY();
    this.beginX = reg.getBeginX();
    this.beginY = reg.getBeginY();
  }

  public void swapObjPos(RegionSpec ballTarget) {
    X = ballTarget.getX();
    Y = ballTarget.getY();
    beginX = ballTarget.getBeginX();
    beginY = ballTarget.getBeginY();
  }

  public void revertPosition() {
    X = beginX;
    Y = beginY;
  }

  public double getCenterX() {
    return X + (this.getWidth() / 2);
  }

  public double getCenterY() {
    return Y + (this.getHeight() / 2);
  }

  void setBeginX(int newValue) {
    beginX = newValue;
  }

  public int getBeginX() {
    return beginX;
  }

  void setBeginY(int newValue) {
    beginY = newValue;
  }

  public int getBeginY() {
    return beginY;
  }

  void setX(int newValue) {
    X = newValue;
  }

  public int getX() {
    return X;
  }

  void setY(int newValue) {
    Y = newValue;
  }

  public int getY() {
    return Y;
  }

  public int getWidth() {
    return img.getWidth();
  }

  public int getHeight() {
    return img.getHeight();
  }

  public String getID() {
    return id;
  }

  public Bitmap getBitmap() {
    return img;
  }

  public int getTitleID() {
	return titleID;
  }
  
  public void setTitleID(int newValue) {
	titleID = newValue;
  }
  
  public void halfOpacity(){
    tintImage(0, 0x55);
  }
  
  public void restoreOpacity(){
    img.setPixels(orgPix, 0, getWidth(), 0, 0, getWidth(), getHeight());
  }
  
  private void tintImage(int deg, int opacity) {

    try {
      int picw = getWidth();
      int pich = getHeight();
      int[] pix = new int[picw * pich];
      img.getPixels(pix, 0, picw, 0, 0, picw, pich);

      int RY, BY, RYY, GYY, BYY, R, G, B, Y;
      double angle = (3.14159d * (double) deg) / 180.0d;
      int S = (int) (256.0d * Math.sin(angle));
      int C = (int) (256.0d * Math.cos(angle));

      for (int y = 0; y < pich; y++)
        for (int x = 0; x < picw; x++) {
          int index = y * picw + x;
          int r = (pix[index] >> 16) & 0xff;
          int g = (pix[index] >> 8) & 0xff;
          int b = pix[index] & 0xff;
          if (pix[index] == 0x00) continue;
          
          RY = (70 * r - 59 * g - 11 * b) / 100;
          BY = (-30 * r - 59 * g + 89 * b) / 100;
          Y = (30 * r + 59 * g + 11 * b) / 100;
          RYY = (S * BY + C * RY) / 256;
          BYY = (C * BY - S * RY) / 256;
          GYY = (-51 * RYY - 19 * BYY) / 100;
          R = Y + RYY;
          R = (R < 0) ? 0 : ((R > 255) ? 255 : R);
          G = Y + GYY;
          G = (G < 0) ? 0 : ((G > 255) ? 255 : G);
          B = Y + BYY;
          B = (B < 0) ? 0 : ((B > 255) ? 255 : B);
          pix[index] = 0x00000000 | (opacity << 24) | (R << 16) | (G << 8) | B;
        }

      img = Bitmap.createBitmap(picw, pich, Bitmap.Config.ARGB_4444);
      img.setPixels(pix, 0, picw, 0, 0, picw, pich);
      pix = null;

    } catch (Exception e) {
      Log.i("POS_LOG", e.getMessage());
    }
  }
}
